package kaiao.doublePoint;

/**
 * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
 *
 * 请注意 ，必须在不复制数组的情况下原地对数组进行操作。
 * @author kai.ao
 * @since 2024/5/13
 */
public class 移动零 {

	public void moveZeroes(int[] nums) {

		// 判断数组是否为空或者数据lengh = 0 则直接返回
		if (nums == null || nums.length == 0) {
			return;
		}

		// 主要运用两个指针的概念，j定位非0个数，之后用i全部指针遍历，将j指针范围外的设置为0
		//第一次遍历的时候，j指针记录非0的个数，只要是非0的统统都赋给nums[j]
		int j = 0;
		for (int i = 0; i < nums.length; ++i) {
			if (nums[i] != 0) {
				nums[j++] = nums[i];
			}
		}

		//非0元素统计完了，剩下的都是0了
		//所以第二次遍历把末尾的元素都赋为0即可
		for (int i = j; i < nums.length; ++i) {
			nums[i] = 0;
		}
	}
}
